package com.chenu.gamscriptman.service.impl;

import com.chenu.gamscriptman.compoent.Global;
import com.chenu.gamscriptman.domain.noindb.Message;
import com.chenu.gamscriptman.service.DocumentTask;
import jxl.write.WriteException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * @author flyan
 * date 2020-02-16
 * @function
 */
@Service("documentTask")
public class DocumentTaskImpl implements DocumentTask {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /* redis模板，用于缓存和处理结果的暂存 */
    @Autowired
    private RedisTemplate jsonRedisTemplate;

    private String documentFileName = "haveFun.txt";

    /* 任务能提供的所有功能索引号 */
    public static final int DOCUMENT_LIST = 0;              /* 得到文档信息 */
    public static final int DOCUMENT_ADD_UPDATE = 2;        /* 添加或更新文档 */
    public static final int DOCUMENT_GET = 5;                 /* 获取文档内容 */

    @Override
    public Message task(Message message) {
        Message rs = null;  /* 就是一个指针 */

        /* 看看用户想做什么？ */
        switch (message.getType()) {
            case DOCUMENT_LIST:                 /* 得到文档信息 */
                logger.debug("文档任务：DOCUMENT_LIST...");
                rs = do_list(message);
                break;

            case DOCUMENT_ADD_UPDATE:           /* 添加或更新文档 */
                logger.debug("文档任务：DOCUMENT_ADD_UPDATE...");
                rs = do_add_or_update(message);
                break;

            case DOCUMENT_GET:                    /* 获取文档内容 */
                logger.debug("文档任务：DOCUMENT_GET...");
                rs = do_get(message);
                break;

            default:
                logger.warn("文档任务：你正在请求一个不存在的功能服务...");
                rs = do_no_call(message);
                break;
        }

        return rs;
    }

    private Message do_get(Message message) {
        /* 获取文档内容 */
        String parentDir = Global.DOWNLOAD_PATH + "/docs";
        String filePath = parentDir + "/" + documentFileName;
        File file = new File(filePath);
        String fileContent = getDocumentContent(file);

        /* 返回结果 */
        return MessageServiceImpl.TaskFinish(
                message,
                (long) MessageServiceImpl.DOCUMENT_TASK,
                Message.HANDLER_SUCCESS,
                fileContent
        );
    }

    private String getDocumentContent(File file) {
        String fileContent = "";
        if(file.exists()){
            /* 文件存在才读取文件内容 */
            try {
                int length = new Long(file.length()).intValue();
                int offset = 0;
                byte[] fileContentOrigin = new byte[length];
                FileInputStream in = new FileInputStream(file);
                while (length > 0){
                    int readLength = in.read(fileContentOrigin, offset, length);
                    offset += readLength;
                    length -= readLength;
                }
                in.close();
                /* 将文件内容转为字符串 */
                fileContent = new String(fileContentOrigin, StandardCharsets.UTF_8);
//                System.out.println("-->" + fileContent);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return fileContent;
    }

    private Message do_add_or_update(Message message) {
        int handleState = Message.HANDLER_FAILURE;
        String returnData;
        String parentDir = Global.DOWNLOAD_PATH + "/docs";
        /* 如果父目录不存在，创建它 */
        File parentDirFile = new File(parentDir);
        if(!parentDirFile.exists()){
            if(!parentDirFile.mkdirs()){
                returnData = "文档任务：文件目录创建失败，无法保存文档！";
            }
        }
        /* 得到文件全路径 */
        String filePath = parentDir + "/" + documentFileName;
        File file = new File(filePath);
        /* 创建文件，如果文件创建失败则返回null */
        try {
            if(!file.exists()){
                /* 文档不存在，创建文档 */
                if(!file.createNewFile()){
                    returnData = "文档任务：文档创建失败，无法保存文档！";
                }
            }
            /* 写入数据到文档 */
            FileWriter fileWriter = new FileWriter(file);
            fileWriter.write(message.getData());
            fileWriter.flush();
            fileWriter.close();
            returnData = "文档任务：文档保存&更新成功！";
        } catch (IOException ioe){
            returnData = "文档任务：文档创建出现异常，请重试！";
        }

        /* "文档任务：更新文档成功！" */
        /* 返回结果 */
        return MessageServiceImpl.TaskFinish(
                message,
                (long) MessageServiceImpl.DOCUMENT_TASK,
                Message.HANDLER_SUCCESS,
                returnData
        );
    }

    private Message do_list(Message message) {
        int handleState = Message.HANDLER_FAILURE;
        String returnData;
        /* 获取文档内容 */
        String parentDir = Global.DOWNLOAD_PATH + "/docs";
        String filePath = parentDir + "/" + documentFileName;
        File file = new File(filePath);
        String fileContent = getDocumentContent(file);
        /* 将文件内容放入到缓存中 */
        jsonRedisTemplate.opsForValue().set(Global.REDIS_DOCUMENT_CONTENT, fileContent);
        /* 返回结果 */
        return MessageServiceImpl.TaskFinish(
                message,
                (long) MessageServiceImpl.DOCUMENT_TASK,
                Message.HANDLER_SUCCESS,
                "/docs"
        );
    }

    /* 不支持该服务调用 */
    private Message do_no_call(Message message) {
        return MessageServiceImpl.TaskFinish(
                message,
                (long) MessageServiceImpl.DEVICE_TASK,
                Message.HANDLER_FAILURE,
                "文档任务：你请求了一个不存在的功能服务......"
        );
    }

}
